package org.zxb.demo.resolver;

import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j2;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import org.zxb.demo.annotation.MultipartFileVerify;
import org.zxb.demo.constant.FileType;
import org.zxb.demo.util.FileTypeUtil;

import java.util.Arrays;

/**
 * 文件类型校验-不允许的文件类型
 *
 * @author zxb
 * @date 2022-04-08 10:03
 **/
@Log4j2
@NoArgsConstructor
public class MultipartFileNotAllowValidator extends AbstractMultipartFileValidator {

    protected AbstractMultipartFileValidator delegate;

    public MultipartFileNotAllowValidator(AbstractMultipartFileValidator abstractMultipartFileValidator) {
        delegate = abstractMultipartFileValidator;
    }

    @Override
    @SneakyThrows
    public boolean isFileValid(MultipartFileVerify multipartFileValid, MultipartFile value) {
        FileType[] fileTypes = multipartFileValid.notAllow();
        String sourceFileType = FileTypeUtil.getFileType(value.getInputStream());
        // 不配置 或 没有不允许上传的文件类型，则委托给下一个校验器
        if (ObjectUtils.isEmpty(fileTypes) || allow(fileTypes, sourceFileType)) {
            return delegate.isFileValid(multipartFileValid, value);
        }
        log.warn("不允许的文件类型：{}", sourceFileType);
        return false;
    }

    private boolean allow(FileType[] fileTypes, String sourceFileType) {
        return !isNotAllow(fileTypes, sourceFileType);
    }

    @SneakyThrows
    private boolean isNotAllow(FileType[] fileTypes, String sourceFileType) {
        return Arrays.stream(fileTypes).anyMatch(fileType -> fileType.getName().equals(sourceFileType));
    }
}
